package com.topvision.utils.file;

import sun.misc.BASE64Decoder;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * @author shengwm
 * @version V0.0.1
 * @Title: FileTypeUtils
 * @Package com.topvision.common.utils.file
 * @Description: TODO
 * @date 2017/6/8
 */
public class FileTypeUtils {
    /**
     * Constructor
     */
    private FileTypeUtils() {
    }

    /**
     * 将文件头转换成16进制字符串
     *
     * @param 原生byte
     * @return 16进制字符串
     */
    private static String bytesToHexString(byte[] src) {

        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }

    /**
     * 得到文件头
     *
     * @param filePath 文件路径
     * @return 文件头
     * @throws IOException
     */
    private static String getFileContent(String filePath) throws IOException {

        byte[] b = new byte[28];

        InputStream inputStream = null;

        try {
            inputStream = new FileInputStream(filePath);
            inputStream.read(b, 0, 28);
        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    throw e;
                }
            }
        }
        return bytesToHexString(b);
    }

    public static FileType getType(byte[] bytes) throws IOException {
        String fileHead = bytesToHexString(bytes);

        if (fileHead == null || fileHead.length() == 0) {
            return null;
        }

        fileHead = fileHead.toUpperCase();

        FileType[] fileTypes = FileType.values();

        for (FileType type : fileTypes) {
            if (fileHead.startsWith(type.getLabel())) {
                return type;
            }
        }
        return null;
    }

    public static FileType getType(String base64String) throws IOException {

        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytes = decoder.decodeBuffer(base64String);

        String fileHead = bytesToHexString(bytes);

        if (fileHead == null || fileHead.length() == 0) {
            return null;
        }

        fileHead = fileHead.toUpperCase();

        FileType[] fileTypes = FileType.values();

        for (FileType type : fileTypes) {
            if (fileHead.startsWith(type.getLabel())) {
                return type;
            }
        }
        return null;
    }


//    public static void main(String[] args) {
//        try {
//            System.out.print(FileTypeUtils.getType("D:/test.png"));
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
}
